﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.Unity;
using PharmacyBussinesEntities;
using PharmacyRepositoy;

namespace PharmacyService
{
    public class VentaService : IVentaService
    {
        [Dependency]
        public IVentaRepository ventaRepository { get; set; }

        [Dependency]
        public ILoteRepository loteRepository { get; set; }
        [Dependency]
        public IDetalleVentaRepository detVentaRepo { get; set; }
        public IEnumerable<Venta> GetVentasByCriterio(string criterio)
        {
            return ventaRepository.GetVentasByCriterio(criterio);
        }

        public Venta GetVentaById(int id)
        {
            return ventaRepository.getVentaById(id);
        }

        public void AddVenta(Venta venta)
        {
            ValidarStocks(venta);
            ventaRepository.AddVenta(venta);
            foreach (var item in venta.DetalleVenta)
            {
                var actLote = loteRepository.GetFromLoteById(item.IdLote);
                actLote.Cantidad = actLote.Cantidad - item.Cantidad;
                loteRepository.UpdateLote(actLote);
            }
        }

        public void UpdateVenta(Venta venta)
        {
            ventaRepository.UpdateVenta(venta);
        }

        public void RemoveVenta(int id)
        {
            ventaRepository.RemoveVenta(id);
        }
        private void ValidarStocks(Venta venta)
        {
            foreach (var item in venta.DetalleVenta)
            {
                var producto = loteRepository.GetFromLoteById(item.IdLote);
                var cantActualDetalle = detVentaRepo.GetFromProductoByDetalleVentaId(item.IdLote, venta.Id);

                if (cantActualDetalle == null)
                {
                    if (item.Cantidad > producto.Cantidad)
                    {
                        throw new Exception(string.Format("No hay Stock suficiente para el producto {0}," +
                                          " solo quedan {1} Und.", producto.Descripcion, producto.Cantidad));
                    }
                }
                if (cantActualDetalle != null)
                {
                    var stockActual = producto.Cantidad + cantActualDetalle.Cantidad;
                    if (item.Cantidad > stockActual)
                    {
                        throw new Exception(string.Format("La maxima cantidad a elegir del producto {0}," +
                                          " es {1} Und.", producto.Descripcion, stockActual));
                    }
                }
            }
        }
    }
}
